//
//  UserAccount.swift
//  CYMWeiBo-20
//
//  Created by apple on 15/12/15.
//  Copyright © 2015年 IT 小码农. All rights reserved.
//

import UIKit

//用户账户 模型用作自定义归档
class UserAccount: NSObject,NSCoding {
/*
    
        返回值字段	字段类型	字段说明
    access_token	string	用于调用access_token，接口获取授权后的access token。
    expires_in	    string	access_token的生命周期，单位是秒数。
    uid	            string	当前授权用户的UID。
    avatar_large	string	用户头像地址（大图），180×180像素
    name	        string	友好显示名称
*/
    
    var access_token: String?
    
    //结束--> A克斯拍啊  access_token的生命周期，单位是秒数
    var expires_in: NSTimeInterval = 0 {
    
        didSet {
        //当过期时间一旦被设置的时候 就立即设置 expires_date  给一个时间 算出相对应当前时间是对应是往前还是往后 时间 间隔 从现在 开始
            expires_date = NSDate(timeIntervalSinceNow: expires_in)
        }
    }
    
    //token 的过期日期  开发者账号的 token 的有效期是5年,普通用户的账号有效期是3天
    var expires_date: NSDate?
    
    var uid: String?
    
    var name: String?
    
    //avatar 图标-->额沃特 large 大的-->来接
    var avatar_large: String?
    //KVC 给对象赋初始值
     init(dict: [String : AnyObject]) {
        //对象构造的最后一步
        super.init()//不调用此句 编译器并不知道self 被省略掉
        setValuesForKeysWithDictionary(dict)//本身是 self 的方法,省略了 self
        
    }
    
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
    }
    
    //z只读属性--也叫计算性属性
    override var description: String {
    
        let keys = ["access_token","expires_in","uid","name","avatar_large","expires_date"]
        
        return dictionaryWithValuesForKeys(keys).description
        
    }
    
    //保存自定义对象-->对象方法
    func saveAccount() {
    
        //存储在沙盒中 Doc/Lib
        //字符串拼接路径的方法 在 Xcode7中被搞丢了 需要转换成 NSString
        //只有字符串,数组,字典是不需要加上?或者!
        //String<->NSString [Key: Value]<->NSDictionary  [数组] <->NSArray
        let path = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("account.plist")
        print(path)
        
        
        //保存自定义对象
        NSKeyedArchiver.archiveRootObject(self, toFile: path)
        
    }
    
    //MARK:类方法 
    class func loadAccount() -> UserAccount? {
    //从磁盘中解档数据
    let path = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("account.plist")
        
        if let account = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? UserAccount {
//        print(account)
            
            //对 token 的有效期做判断,如果过期 返回 nil
            if account.expires_date?.compare(NSDate()) == NSComparisonResult.OrderedDescending { //降序
                //比较结果
            return account
            }
            
        }
        return nil
    }
    
    
    //解档操作 将磁盘中的二进制数据 转换成自定义对象 --->和反序列化类似
    required init?(coder aDecoder: NSCoder) {
        //as? 还是 as! 具体取决于接收或者需要使用的类型是可选还是必选
        access_token = aDecoder.decodeObjectForKey("access_token") as? String
        
        //如果世界本数据类型 可以直接获取到具体类型的数据 不需要类型转换
        expires_in = aDecoder.decodeDoubleForKey("expires_in")
        
        uid = aDecoder.decodeObjectForKey("uid") as? String
        
        avatar_large = aDecoder.decodeObjectForKey("avatar_large") as? String
        
        name = aDecoder.decodeObjectForKey("name") as? String
        
        expires_date = aDecoder.decodeObjectForKey("expires_date") as? NSDate
    }
    
    //归档操作 将自定义对象 转换成二进制数据  -->与 OC 的序列化类似
    func encodeWithCoder(aCoder: NSCoder) {
    
        aCoder.encodeObject(access_token, forKey: "access_token")
        aCoder.encodeDouble(expires_in, forKey: "expires_in")
        aCoder.encodeObject(uid, forKey: "uid")
        aCoder.encodeObject(avatar_large, forKey: "avatar_large")
        aCoder.encodeObject(name, forKey: "name")
        aCoder.encodeObject(expires_date, forKey: "expires_date")
    }
}
//
////MARK: 扩展 用户账户 实现两个协议方法
//extension UserAccount: NSCoding {
//
//
//}

